module MYFIFO(
  input          clock,
  input          reset,
  input  [511:0] io_memData,
  input          io_memValid,
  input          io_advance_fifo,
  output [23:0]  io_tile_0,
  output [23:0]  io_tile_1,
  output [23:0]  io_tile_2,
  output         io_ready
);
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_0;
  reg [511:0] _RAND_1;
  reg [31:0] _RAND_2;
  reg [31:0] _RAND_3;
  reg [31:0] _RAND_4;
  reg [31:0] _RAND_5;
  reg [31:0] _RAND_6;
  reg [95:0] _RAND_7;
  reg [95:0] _RAND_8;
  reg [95:0] _RAND_9;
`endif // RANDOMIZE_REG_INIT
  reg  startup; // @[MYFIFO.scala 34:30]
  reg [511:0] topBuf_0; // @[MYFIFO.scala 38:29]
  reg  droptile; // @[MYFIFO.scala 41:31]
  reg  full; // @[MYFIFO.scala 62:27]
  reg  empty2; // @[MYFIFO.scala 75:29]
  wire  _T_4 = full & empty2; // @[MYFIFO.scala 83:26]
  reg  empty3; // @[MYFIFO.scala 76:29]
  reg  empty4; // @[MYFIFO.scala 77:29]
  wire  _GEN_12 = empty4 & ~empty3 ? 1'h0 : droptile; // @[MYFIFO.scala 91:39]
  wire  _GEN_18 = empty3 & ~empty2 ? 1'h0 : _GEN_12; // @[MYFIFO.scala 87:39]
  wire  _GEN_26 = full & empty2 ? 1'h0 : _GEN_18; // @[MYFIFO.scala 83:37]
  wire  clearDrop = ~startup ? 1'h0 : _GEN_26; // @[MYFIFO.scala 79:23]
  wire  _GEN_0 = clearDrop ? 1'h0 : droptile; // @[MYFIFO.scala 46:32 47:26 41:31]
  wire  _GEN_1 = io_advance_fifo | _GEN_0; // @[MYFIFO.scala 44:30 45:26]
  wire  clearTop = ~startup ? 1'h0 : _T_4; // @[MYFIFO.scala 79:23]
  wire  _GEN_5 = clearTop ? 1'h0 : full; // @[MYFIFO.scala 66:31 67:22 62:27]
  wire  _GEN_6 = io_memValid | _GEN_5; // @[MYFIFO.scala 64:52 65:22]
  reg [71:0] buf2; // @[MYFIFO.scala 71:27]
  reg [71:0] buf3; // @[MYFIFO.scala 72:27]
  reg [71:0] buf4; // @[MYFIFO.scala 73:27]
  wire  _GEN_7 = droptile | empty4; // @[MYFIFO.scala 95:30 96:24 77:29]
  wire [71:0] _GEN_9 = empty4 & ~empty3 ? buf3 : buf4; // @[MYFIFO.scala 91:39 92:22 73:27]
  wire  _GEN_10 = empty4 & ~empty3 ? 1'h0 : _GEN_7; // @[MYFIFO.scala 91:39 93:24]
  wire  _GEN_11 = empty4 & ~empty3 | empty3; // @[MYFIFO.scala 91:39 94:24 76:29]
  wire  _GEN_14 = empty3 & ~empty2 ? 1'h0 : _GEN_11; // @[MYFIFO.scala 87:39 89:24]
  wire  _GEN_15 = empty3 & ~empty2 | empty2; // @[MYFIFO.scala 87:39 90:24 75:29]
  wire  _GEN_17 = empty3 & ~empty2 ? empty4 : _GEN_10; // @[MYFIFO.scala 77:29 87:39]
  wire [511:0] _GEN_19 = full & empty2 ? topBuf_0 : {{440'd0}, buf2}; // @[MYFIFO.scala 83:37 84:22 71:27]
  wire  _GEN_21 = full & empty2 ? 1'h0 : _GEN_15; // @[MYFIFO.scala 83:37 86:24]
  wire  _GEN_23 = full & empty2 ? empty3 : _GEN_14; // @[MYFIFO.scala 76:29 83:37]
  wire  _GEN_25 = full & empty2 ? empty4 : _GEN_17; // @[MYFIFO.scala 77:29 83:37]
  wire  _GEN_27 = ~startup | _GEN_21; // @[MYFIFO.scala 79:23 80:24]
  wire  _GEN_28 = ~startup | _GEN_23; // @[MYFIFO.scala 79:23 81:24]
  wire  _GEN_29 = ~startup | _GEN_25; // @[MYFIFO.scala 79:23 82:24]
  wire [511:0] _GEN_30 = ~startup ? {{440'd0}, buf2} : _GEN_19; // @[MYFIFO.scala 79:23 71:27]
  wire [511:0] _GEN_35 = reset ? 512'h0 : _GEN_30; // @[MYFIFO.scala 71:{27,27}]
  assign io_tile_0 = buf4[23:0]; // @[MYFIFO.scala 103:35]
  assign io_tile_1 = buf4[47:24]; // @[MYFIFO.scala 103:35]
  assign io_tile_2 = buf4[71:48]; // @[MYFIFO.scala 103:35]
  assign io_ready = startup & ~empty4 & ~droptile; // @[MYFIFO.scala 100:42]
  always @(posedge clock) begin
    if (reset) begin // @[MYFIFO.scala 34:30]
      startup <= 1'h0; // @[MYFIFO.scala 34:30]
    end else begin
      startup <= 1'h1; // @[MYFIFO.scala 34:30]
    end
    if (reset) begin // @[MYFIFO.scala 38:29]
      topBuf_0 <= 512'h0; // @[MYFIFO.scala 38:29]
    end else if (io_memValid) begin // @[MYFIFO.scala 51:26]
      topBuf_0 <= io_memData; // @[MYFIFO.scala 58:31]
    end
    if (reset) begin // @[MYFIFO.scala 41:31]
      droptile <= 1'h0; // @[MYFIFO.scala 41:31]
    end else begin
      droptile <= _GEN_1;
    end
    if (reset) begin // @[MYFIFO.scala 62:27]
      full <= 1'h0; // @[MYFIFO.scala 62:27]
    end else begin
      full <= _GEN_6;
    end
    empty2 <= reset | _GEN_27; // @[MYFIFO.scala 75:{29,29}]
    empty3 <= reset | _GEN_28; // @[MYFIFO.scala 76:{29,29}]
    empty4 <= reset | _GEN_29; // @[MYFIFO.scala 77:{29,29}]
    buf2 <= _GEN_35[71:0]; // @[MYFIFO.scala 71:{27,27}]
    if (reset) begin // @[MYFIFO.scala 72:27]
      buf3 <= 72'h0; // @[MYFIFO.scala 72:27]
    end else if (!(~startup)) begin // @[MYFIFO.scala 79:23]
      if (!(full & empty2)) begin // @[MYFIFO.scala 83:37]
        if (empty3 & ~empty2) begin // @[MYFIFO.scala 87:39]
          buf3 <= buf2; // @[MYFIFO.scala 88:22]
        end
      end
    end
    if (reset) begin // @[MYFIFO.scala 73:27]
      buf4 <= 72'h0; // @[MYFIFO.scala 73:27]
    end else if (!(~startup)) begin // @[MYFIFO.scala 79:23]
      if (!(full & empty2)) begin // @[MYFIFO.scala 83:37]
        if (!(empty3 & ~empty2)) begin // @[MYFIFO.scala 87:39]
          buf4 <= _GEN_9;
        end
      end
    end
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  startup = _RAND_0[0:0];
  _RAND_1 = {16{`RANDOM}};
  topBuf_0 = _RAND_1[511:0];
  _RAND_2 = {1{`RANDOM}};
  droptile = _RAND_2[0:0];
  _RAND_3 = {1{`RANDOM}};
  full = _RAND_3[0:0];
  _RAND_4 = {1{`RANDOM}};
  empty2 = _RAND_4[0:0];
  _RAND_5 = {1{`RANDOM}};
  empty3 = _RAND_5[0:0];
  _RAND_6 = {1{`RANDOM}};
  empty4 = _RAND_6[0:0];
  _RAND_7 = {3{`RANDOM}};
  buf2 = _RAND_7[71:0];
  _RAND_8 = {3{`RANDOM}};
  buf3 = _RAND_8[71:0];
  _RAND_9 = {3{`RANDOM}};
  buf4 = _RAND_9[71:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule
module MACArraySetUp(
  input         clock,
  input         reset,
  input  [71:0] io_dataIn,
  input  [7:0]  io_mmu2setup_waddr,
  input         io_mmu2setup_wen,
  input         io_mmu2setup_wclear,
  input         io_mmu2setup_lastvec,
  input         io_switch,
  output [7:0]  io_nextRow_0,
  output [7:0]  io_nextRow_1,
  output [7:0]  io_nextRow_2,
  output        io_switchOut_0,
  output        io_switchOut_1,
  output        io_switchOut_2,
  output [7:0]  io_setup2accu_waddr,
  output        io_setup2accu_wen,
  output        io_setup2accu_wclear,
  output        io_setup2accu_lastvec
);
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_0;
  reg [31:0] _RAND_1;
  reg [31:0] _RAND_2;
  reg [31:0] _RAND_3;
  reg [31:0] _RAND_4;
  reg [31:0] _RAND_5;
  reg [31:0] _RAND_6;
  reg [31:0] _RAND_7;
  reg [31:0] _RAND_8;
  reg [31:0] _RAND_9;
  reg [31:0] _RAND_10;
  reg [31:0] _RAND_11;
  reg [31:0] _RAND_12;
  reg [31:0] _RAND_13;
  reg [31:0] _RAND_14;
  reg [31:0] _RAND_15;
  reg [31:0] _RAND_16;
  reg [31:0] _RAND_17;
  reg [31:0] _RAND_18;
  reg [31:0] _RAND_19;
  reg [31:0] _RAND_20;
  reg [31:0] _RAND_21;
  reg [31:0] _RAND_22;
  reg [31:0] _RAND_23;
`endif // RANDOMIZE_REG_INIT
  reg [7:0] firstColumnReg_0; // @[macarraySetup.scala 23:37]
  reg [7:0] firstColumnReg_1; // @[macarraySetup.scala 23:37]
  reg [7:0] firstColumnReg_2; // @[macarraySetup.scala 23:37]
  reg  switchReg_0; // @[macarraySetup.scala 36:32]
  reg  switchReg_1; // @[macarraySetup.scala 36:32]
  reg  switchReg_2; // @[macarraySetup.scala 36:32]
  reg [7:0] io_setup2accu_waddr_r; // @[Reg.scala 28:20]
  reg [7:0] io_setup2accu_waddr_r_1; // @[Reg.scala 28:20]
  reg [7:0] io_setup2accu_waddr_r_2; // @[Reg.scala 28:20]
  reg [7:0] io_setup2accu_waddr_r_3; // @[Reg.scala 28:20]
  reg  io_setup2accu_wen_r; // @[Reg.scala 28:20]
  reg  io_setup2accu_wen_r_1; // @[Reg.scala 28:20]
  reg  io_setup2accu_wen_r_2; // @[Reg.scala 28:20]
  reg  io_setup2accu_wen_r_3; // @[Reg.scala 28:20]
  reg  io_setup2accu_wclear_r; // @[Reg.scala 28:20]
  reg  io_setup2accu_wclear_r_1; // @[Reg.scala 28:20]
  reg  io_setup2accu_wclear_r_2; // @[Reg.scala 28:20]
  reg  io_setup2accu_wclear_r_3; // @[Reg.scala 28:20]
  reg  io_setup2accu_lastvec_r; // @[Reg.scala 28:20]
  reg  io_setup2accu_lastvec_r_1; // @[Reg.scala 28:20]
  reg  io_setup2accu_lastvec_r_2; // @[Reg.scala 28:20]
  reg [7:0] diagnonalWire_1_r; // @[Reg.scala 16:16]
  reg [7:0] diagnonalWire_0_r; // @[Reg.scala 16:16]
  reg [7:0] diagnonalWire_0_r_1; // @[Reg.scala 16:16]
  assign io_nextRow_0 = diagnonalWire_0_r_1; // @[macarraySetup.scala 65:51]
  assign io_nextRow_1 = diagnonalWire_1_r; // @[macarraySetup.scala 65:51]
  assign io_nextRow_2 = firstColumnReg_0; // @[macarraySetup.scala 65:51]
  assign io_switchOut_0 = switchReg_0; // @[macarraySetup.scala 56:22]
  assign io_switchOut_1 = switchReg_1; // @[macarraySetup.scala 56:22]
  assign io_switchOut_2 = switchReg_2; // @[macarraySetup.scala 56:22]
  assign io_setup2accu_waddr = io_setup2accu_waddr_r_3; // @[macarraySetup.scala 51:29]
  assign io_setup2accu_wen = io_setup2accu_wen_r_3; // @[macarraySetup.scala 52:27]
  assign io_setup2accu_wclear = io_setup2accu_wclear_r_3; // @[macarraySetup.scala 53:30]
  assign io_setup2accu_lastvec = io_setup2accu_lastvec_r_2; // @[macarraySetup.scala 54:31]
  always @(posedge clock) begin
    if (reset) begin // @[macarraySetup.scala 23:37]
      firstColumnReg_0 <= 8'h0; // @[macarraySetup.scala 23:37]
    end else begin
      firstColumnReg_0 <= io_dataIn[7:0]; // @[macarraySetup.scala 29:35]
    end
    if (reset) begin // @[macarraySetup.scala 23:37]
      firstColumnReg_1 <= 8'h0; // @[macarraySetup.scala 23:37]
    end else begin
      firstColumnReg_1 <= io_dataIn[15:8]; // @[macarraySetup.scala 29:35]
    end
    if (reset) begin // @[macarraySetup.scala 23:37]
      firstColumnReg_2 <= 8'h0; // @[macarraySetup.scala 23:37]
    end else begin
      firstColumnReg_2 <= io_dataIn[23:16]; // @[macarraySetup.scala 29:35]
    end
    if (reset) begin // @[macarraySetup.scala 36:32]
      switchReg_0 <= 1'h0; // @[macarraySetup.scala 36:32]
    end else begin
      switchReg_0 <= switchReg_1; // @[macarraySetup.scala 45:32]
    end
    if (reset) begin // @[macarraySetup.scala 36:32]
      switchReg_1 <= 1'h0; // @[macarraySetup.scala 36:32]
    end else begin
      switchReg_1 <= switchReg_2; // @[macarraySetup.scala 45:32]
    end
    if (reset) begin // @[macarraySetup.scala 36:32]
      switchReg_2 <= 1'h0; // @[macarraySetup.scala 36:32]
    end else begin
      switchReg_2 <= io_switch; // @[macarraySetup.scala 47:24]
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_waddr_r <= 8'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_waddr_r <= io_mmu2setup_waddr;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_waddr_r_1 <= 8'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_waddr_r_1 <= io_setup2accu_waddr_r;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_waddr_r_2 <= 8'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_waddr_r_2 <= io_setup2accu_waddr_r_1;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_waddr_r_3 <= 8'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_waddr_r_3 <= io_setup2accu_waddr_r_2;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_wen_r <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_wen_r <= io_mmu2setup_wen;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_wen_r_1 <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_wen_r_1 <= io_setup2accu_wen_r;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_wen_r_2 <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_wen_r_2 <= io_setup2accu_wen_r_1;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_wen_r_3 <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_wen_r_3 <= io_setup2accu_wen_r_2;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_wclear_r <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_wclear_r <= io_mmu2setup_wclear;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_wclear_r_1 <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_wclear_r_1 <= io_setup2accu_wclear_r;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_wclear_r_2 <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_wclear_r_2 <= io_setup2accu_wclear_r_1;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_wclear_r_3 <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_wclear_r_3 <= io_setup2accu_wclear_r_2;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_lastvec_r <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_lastvec_r <= io_mmu2setup_lastvec;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_lastvec_r_1 <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_lastvec_r_1 <= io_setup2accu_lastvec_r;
    end
    if (reset) begin // @[Reg.scala 28:20]
      io_setup2accu_lastvec_r_2 <= 1'h0; // @[Reg.scala 28:20]
    end else begin
      io_setup2accu_lastvec_r_2 <= io_setup2accu_lastvec_r_1;
    end
    diagnonalWire_1_r <= firstColumnReg_1; // @[Reg.scala 16:16 17:{18,22}]
    diagnonalWire_0_r <= firstColumnReg_2; // @[Reg.scala 16:16 17:{18,22}]
    diagnonalWire_0_r_1 <= diagnonalWire_0_r; // @[Reg.scala 16:16 17:{18,22}]
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  firstColumnReg_0 = _RAND_0[7:0];
  _RAND_1 = {1{`RANDOM}};
  firstColumnReg_1 = _RAND_1[7:0];
  _RAND_2 = {1{`RANDOM}};
  firstColumnReg_2 = _RAND_2[7:0];
  _RAND_3 = {1{`RANDOM}};
  switchReg_0 = _RAND_3[0:0];
  _RAND_4 = {1{`RANDOM}};
  switchReg_1 = _RAND_4[0:0];
  _RAND_5 = {1{`RANDOM}};
  switchReg_2 = _RAND_5[0:0];
  _RAND_6 = {1{`RANDOM}};
  io_setup2accu_waddr_r = _RAND_6[7:0];
  _RAND_7 = {1{`RANDOM}};
  io_setup2accu_waddr_r_1 = _RAND_7[7:0];
  _RAND_8 = {1{`RANDOM}};
  io_setup2accu_waddr_r_2 = _RAND_8[7:0];
  _RAND_9 = {1{`RANDOM}};
  io_setup2accu_waddr_r_3 = _RAND_9[7:0];
  _RAND_10 = {1{`RANDOM}};
  io_setup2accu_wen_r = _RAND_10[0:0];
  _RAND_11 = {1{`RANDOM}};
  io_setup2accu_wen_r_1 = _RAND_11[0:0];
  _RAND_12 = {1{`RANDOM}};
  io_setup2accu_wen_r_2 = _RAND_12[0:0];
  _RAND_13 = {1{`RANDOM}};
  io_setup2accu_wen_r_3 = _RAND_13[0:0];
  _RAND_14 = {1{`RANDOM}};
  io_setup2accu_wclear_r = _RAND_14[0:0];
  _RAND_15 = {1{`RANDOM}};
  io_setup2accu_wclear_r_1 = _RAND_15[0:0];
  _RAND_16 = {1{`RANDOM}};
  io_setup2accu_wclear_r_2 = _RAND_16[0:0];
  _RAND_17 = {1{`RANDOM}};
  io_setup2accu_wclear_r_3 = _RAND_17[0:0];
  _RAND_18 = {1{`RANDOM}};
  io_setup2accu_lastvec_r = _RAND_18[0:0];
  _RAND_19 = {1{`RANDOM}};
  io_setup2accu_lastvec_r_1 = _RAND_19[0:0];
  _RAND_20 = {1{`RANDOM}};
  io_setup2accu_lastvec_r_2 = _RAND_20[0:0];
  _RAND_21 = {1{`RANDOM}};
  diagnonalWire_1_r = _RAND_21[7:0];
  _RAND_22 = {1{`RANDOM}};
  diagnonalWire_0_r = _RAND_22[7:0];
  _RAND_23 = {1{`RANDOM}};
  diagnonalWire_0_r_1 = _RAND_23[7:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule
module MYMAC(
  input         clock,
  input         reset,
  input  [7:0]  io_macIO_dataIn,
  input  [31:0] io_macIO_accIn,
  input         io_macIO_switchw,
  input  [7:0]  io_macIO_weightIn,
  input         io_macIO_weightWe,
  input  [7:0]  io_macIO_weightTag,
  output [31:0] io_macIO_outDelay,
  output [7:0]  io_macIO_dataDelay,
  output        io_macIO_switchDelay,
  output [7:0]  io_macIO_weightDelay,
  output        io_macIO_weightWeDelay,
  output [7:0]  io_macIO_weightTagDelay
);
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_0;
  reg [31:0] _RAND_1;
  reg [31:0] _RAND_2;
  reg [31:0] _RAND_3;
  reg [31:0] _RAND_4;
  reg [31:0] _RAND_5;
  reg [31:0] _RAND_6;
  reg [31:0] _RAND_7;
  reg [31:0] _RAND_8;
`endif // RANDOMIZE_REG_INIT
  reg [7:0] wbuf1; // @[MAC.scala 45:29]
  reg [7:0] wbuf2; // @[MAC.scala 45:29]
  reg  currentBufferReg; // @[MAC.scala 46:33]
  wire  currenBuffer = currentBufferReg ^ io_macIO_switchw; // @[MAC.scala 51:39]
  wire  _T_2 = ~currenBuffer; // @[MAC.scala 54:22]
  wire [7:0] weight = _T_2 ? $signed(wbuf2) : $signed(wbuf1); // @[MAC.scala 61:19]
  wire [15:0] product = $signed(weight) * $signed(io_macIO_dataIn); // @[MAC.scala 62:24]
  wire [31:0] _GEN_5 = {{16{product[15]}},product}; // @[MAC.scala 63:21]
  wire [31:0] out = $signed(_GEN_5) + $signed(io_macIO_accIn); // @[MAC.scala 63:21]
  reg [7:0] io_macIO_dataDelay_REG; // @[MAC.scala 67:32]
  reg  io_macIO_switchDelay_REG; // @[MAC.scala 68:34]
  reg [31:0] io_macIO_outDelay_REG; // @[MAC.scala 69:31]
  reg [7:0] io_macIO_weightDelay_REG; // @[MAC.scala 70:34]
  reg  io_macIO_weightWeDelay_REG; // @[MAC.scala 71:36]
  wire [7:0] _io_macIO_weightTagDelay_T_1 = io_macIO_weightTag + 8'h1; // @[MAC.scala 72:58]
  reg [7:0] io_macIO_weightTagDelay_REG; // @[MAC.scala 72:37]
  assign io_macIO_outDelay = io_macIO_outDelay_REG; // @[MAC.scala 69:21]
  assign io_macIO_dataDelay = io_macIO_dataDelay_REG; // @[MAC.scala 67:22]
  assign io_macIO_switchDelay = io_macIO_switchDelay_REG; // @[MAC.scala 68:24]
  assign io_macIO_weightDelay = io_macIO_weightDelay_REG; // @[MAC.scala 70:24]
  assign io_macIO_weightWeDelay = io_macIO_weightWeDelay_REG; // @[MAC.scala 71:26]
  assign io_macIO_weightTagDelay = io_macIO_weightTagDelay_REG; // @[MAC.scala 72:27]
  always @(posedge clock) begin
    if (reset) begin // @[MAC.scala 45:29]
      wbuf1 <= 8'sh0; // @[MAC.scala 45:29]
    end else if (io_macIO_weightWe & io_macIO_weightTag == 8'h2) begin // @[MAC.scala 53:67]
      if (!(~currenBuffer)) begin // @[MAC.scala 54:29]
        wbuf1 <= io_macIO_weightIn; // @[MAC.scala 57:13]
      end
    end
    if (reset) begin // @[MAC.scala 45:29]
      wbuf2 <= 8'sh0; // @[MAC.scala 45:29]
    end else if (io_macIO_weightWe & io_macIO_weightTag == 8'h2) begin // @[MAC.scala 53:67]
      if (~currenBuffer) begin // @[MAC.scala 54:29]
        wbuf2 <= io_macIO_weightIn; // @[MAC.scala 55:13]
      end
    end
    if (reset) begin // @[MAC.scala 46:33]
      currentBufferReg <= 1'h0; // @[MAC.scala 46:33]
    end else if (io_macIO_switchw) begin // @[MAC.scala 47:25]
      currentBufferReg <= ~currentBufferReg; // @[MAC.scala 48:22]
    end
    if (reset) begin // @[MAC.scala 67:32]
      io_macIO_dataDelay_REG <= 8'sh0; // @[MAC.scala 67:32]
    end else begin
      io_macIO_dataDelay_REG <= io_macIO_dataIn; // @[MAC.scala 67:32]
    end
    if (reset) begin // @[MAC.scala 68:34]
      io_macIO_switchDelay_REG <= 1'h0; // @[MAC.scala 68:34]
    end else begin
      io_macIO_switchDelay_REG <= io_macIO_switchw; // @[MAC.scala 68:34]
    end
    if (reset) begin // @[MAC.scala 69:31]
      io_macIO_outDelay_REG <= 32'sh0; // @[MAC.scala 69:31]
    end else begin
      io_macIO_outDelay_REG <= out; // @[MAC.scala 69:31]
    end
    if (reset) begin // @[MAC.scala 70:34]
      io_macIO_weightDelay_REG <= 8'sh0; // @[MAC.scala 70:34]
    end else begin
      io_macIO_weightDelay_REG <= io_macIO_weightIn; // @[MAC.scala 70:34]
    end
    if (reset) begin // @[MAC.scala 71:36]
      io_macIO_weightWeDelay_REG <= 1'h0; // @[MAC.scala 71:36]
    end else begin
      io_macIO_weightWeDelay_REG <= io_macIO_weightWe; // @[MAC.scala 71:36]
    end
    if (reset) begin // @[MAC.scala 72:37]
      io_macIO_weightTagDelay_REG <= 8'h0; // @[MAC.scala 72:37]
    end else begin
      io_macIO_weightTagDelay_REG <= _io_macIO_weightTagDelay_T_1; // @[MAC.scala 72:37]
    end
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  wbuf1 = _RAND_0[7:0];
  _RAND_1 = {1{`RANDOM}};
  wbuf2 = _RAND_1[7:0];
  _RAND_2 = {1{`RANDOM}};
  currentBufferReg = _RAND_2[0:0];
  _RAND_3 = {1{`RANDOM}};
  io_macIO_dataDelay_REG = _RAND_3[7:0];
  _RAND_4 = {1{`RANDOM}};
  io_macIO_switchDelay_REG = _RAND_4[0:0];
  _RAND_5 = {1{`RANDOM}};
  io_macIO_outDelay_REG = _RAND_5[31:0];
  _RAND_6 = {1{`RANDOM}};
  io_macIO_weightDelay_REG = _RAND_6[7:0];
  _RAND_7 = {1{`RANDOM}};
  io_macIO_weightWeDelay_REG = _RAND_7[0:0];
  _RAND_8 = {1{`RANDOM}};
  io_macIO_weightTagDelay_REG = _RAND_8[7:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule
module MACArray(
  input         clock,
  input         reset,
  input  [7:0]  io_dataIn_0,
  input  [7:0]  io_dataIn_1,
  input  [7:0]  io_dataIn_2,
  input         io_switchw_0,
  input         io_switchw_1,
  input         io_switchw_2,
  input  [23:0] io_weightIn_0,
  input  [23:0] io_weightIn_1,
  input  [23:0] io_weightIn_2,
  input         io_weightWe,
  output [31:0] io_dataOut_0,
  output [31:0] io_dataOut_1,
  output [31:0] io_dataOut_2
);
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_0;
  reg [31:0] _RAND_1;
`endif // RANDOMIZE_REG_INIT
  wire  MYMAC_clock; // @[MACArray.scala 22:15]
  wire  MYMAC_reset; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_io_macIO_dataIn; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_io_macIO_accIn; // @[MACArray.scala 22:15]
  wire  MYMAC_io_macIO_switchw; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_io_macIO_weightIn; // @[MACArray.scala 22:15]
  wire  MYMAC_io_macIO_weightWe; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_io_macIO_weightTag; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_io_macIO_outDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_io_macIO_dataDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_io_macIO_switchDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_io_macIO_weightDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_io_macIO_weightWeDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_io_macIO_weightTagDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_1_clock; // @[MACArray.scala 22:15]
  wire  MYMAC_1_reset; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_1_io_macIO_dataIn; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_1_io_macIO_accIn; // @[MACArray.scala 22:15]
  wire  MYMAC_1_io_macIO_switchw; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_1_io_macIO_weightIn; // @[MACArray.scala 22:15]
  wire  MYMAC_1_io_macIO_weightWe; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_1_io_macIO_weightTag; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_1_io_macIO_outDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_1_io_macIO_dataDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_1_io_macIO_switchDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_1_io_macIO_weightDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_1_io_macIO_weightWeDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_1_io_macIO_weightTagDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_2_clock; // @[MACArray.scala 22:15]
  wire  MYMAC_2_reset; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_2_io_macIO_dataIn; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_2_io_macIO_accIn; // @[MACArray.scala 22:15]
  wire  MYMAC_2_io_macIO_switchw; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_2_io_macIO_weightIn; // @[MACArray.scala 22:15]
  wire  MYMAC_2_io_macIO_weightWe; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_2_io_macIO_weightTag; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_2_io_macIO_outDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_2_io_macIO_dataDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_2_io_macIO_switchDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_2_io_macIO_weightDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_2_io_macIO_weightWeDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_2_io_macIO_weightTagDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_3_clock; // @[MACArray.scala 22:15]
  wire  MYMAC_3_reset; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_3_io_macIO_dataIn; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_3_io_macIO_accIn; // @[MACArray.scala 22:15]
  wire  MYMAC_3_io_macIO_switchw; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_3_io_macIO_weightIn; // @[MACArray.scala 22:15]
  wire  MYMAC_3_io_macIO_weightWe; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_3_io_macIO_weightTag; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_3_io_macIO_outDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_3_io_macIO_dataDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_3_io_macIO_switchDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_3_io_macIO_weightDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_3_io_macIO_weightWeDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_3_io_macIO_weightTagDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_4_clock; // @[MACArray.scala 22:15]
  wire  MYMAC_4_reset; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_4_io_macIO_dataIn; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_4_io_macIO_accIn; // @[MACArray.scala 22:15]
  wire  MYMAC_4_io_macIO_switchw; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_4_io_macIO_weightIn; // @[MACArray.scala 22:15]
  wire  MYMAC_4_io_macIO_weightWe; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_4_io_macIO_weightTag; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_4_io_macIO_outDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_4_io_macIO_dataDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_4_io_macIO_switchDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_4_io_macIO_weightDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_4_io_macIO_weightWeDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_4_io_macIO_weightTagDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_5_clock; // @[MACArray.scala 22:15]
  wire  MYMAC_5_reset; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_5_io_macIO_dataIn; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_5_io_macIO_accIn; // @[MACArray.scala 22:15]
  wire  MYMAC_5_io_macIO_switchw; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_5_io_macIO_weightIn; // @[MACArray.scala 22:15]
  wire  MYMAC_5_io_macIO_weightWe; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_5_io_macIO_weightTag; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_5_io_macIO_outDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_5_io_macIO_dataDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_5_io_macIO_switchDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_5_io_macIO_weightDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_5_io_macIO_weightWeDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_5_io_macIO_weightTagDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_6_clock; // @[MACArray.scala 22:15]
  wire  MYMAC_6_reset; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_6_io_macIO_dataIn; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_6_io_macIO_accIn; // @[MACArray.scala 22:15]
  wire  MYMAC_6_io_macIO_switchw; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_6_io_macIO_weightIn; // @[MACArray.scala 22:15]
  wire  MYMAC_6_io_macIO_weightWe; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_6_io_macIO_weightTag; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_6_io_macIO_outDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_6_io_macIO_dataDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_6_io_macIO_switchDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_6_io_macIO_weightDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_6_io_macIO_weightWeDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_6_io_macIO_weightTagDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_7_clock; // @[MACArray.scala 22:15]
  wire  MYMAC_7_reset; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_7_io_macIO_dataIn; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_7_io_macIO_accIn; // @[MACArray.scala 22:15]
  wire  MYMAC_7_io_macIO_switchw; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_7_io_macIO_weightIn; // @[MACArray.scala 22:15]
  wire  MYMAC_7_io_macIO_weightWe; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_7_io_macIO_weightTag; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_7_io_macIO_outDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_7_io_macIO_dataDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_7_io_macIO_switchDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_7_io_macIO_weightDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_7_io_macIO_weightWeDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_7_io_macIO_weightTagDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_8_clock; // @[MACArray.scala 22:15]
  wire  MYMAC_8_reset; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_8_io_macIO_dataIn; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_8_io_macIO_accIn; // @[MACArray.scala 22:15]
  wire  MYMAC_8_io_macIO_switchw; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_8_io_macIO_weightIn; // @[MACArray.scala 22:15]
  wire  MYMAC_8_io_macIO_weightWe; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_8_io_macIO_weightTag; // @[MACArray.scala 22:15]
  wire [31:0] MYMAC_8_io_macIO_outDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_8_io_macIO_dataDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_8_io_macIO_switchDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_8_io_macIO_weightDelay; // @[MACArray.scala 22:15]
  wire  MYMAC_8_io_macIO_weightWeDelay; // @[MACArray.scala 22:15]
  wire [7:0] MYMAC_8_io_macIO_weightTagDelay; // @[MACArray.scala 22:15]
  reg  programming; // @[MACArray.scala 26:30]
  reg [1:0] progstep; // @[MACArray.scala 27:27]
  wire  _GEN_0 = programming & progstep == 2'h2 ? 1'h0 : programming; // @[MACArray.scala 33:73 34:21 26:30]
  wire  _GEN_1 = io_weightWe & ~programming | _GEN_0; // @[MACArray.scala 31:48 32:21]
  wire [1:0] _progstep_T_1 = progstep + 2'h1; // @[MACArray.scala 38:30]
  wire  _T_6 = 2'h2 == progstep; // @[MACArray.scala 93:32]
  wire  _T_7 = 2'h1 == progstep; // @[MACArray.scala 93:32]
  wire  _T_8 = 2'h0 == progstep; // @[MACArray.scala 93:32]
  wire [23:0] _currentWeight_T = _T_8 ? io_weightIn_2 : 24'h0; // @[Mux.scala 101:16]
  wire [23:0] _currentWeight_T_1 = _T_7 ? io_weightIn_1 : _currentWeight_T; // @[Mux.scala 101:16]
  wire [23:0] currentWeight = _T_6 ? io_weightIn_0 : _currentWeight_T_1; // @[Mux.scala 101:16]
  MYMAC MYMAC ( // @[MACArray.scala 22:15]
    .clock(MYMAC_clock),
    .reset(MYMAC_reset),
    .io_macIO_dataIn(MYMAC_io_macIO_dataIn),
    .io_macIO_accIn(MYMAC_io_macIO_accIn),
    .io_macIO_switchw(MYMAC_io_macIO_switchw),
    .io_macIO_weightIn(MYMAC_io_macIO_weightIn),
    .io_macIO_weightWe(MYMAC_io_macIO_weightWe),
    .io_macIO_weightTag(MYMAC_io_macIO_weightTag),
    .io_macIO_outDelay(MYMAC_io_macIO_outDelay),
    .io_macIO_dataDelay(MYMAC_io_macIO_dataDelay),
    .io_macIO_switchDelay(MYMAC_io_macIO_switchDelay),
    .io_macIO_weightDelay(MYMAC_io_macIO_weightDelay),
    .io_macIO_weightWeDelay(MYMAC_io_macIO_weightWeDelay),
    .io_macIO_weightTagDelay(MYMAC_io_macIO_weightTagDelay)
  );
  MYMAC MYMAC_1 ( // @[MACArray.scala 22:15]
    .clock(MYMAC_1_clock),
    .reset(MYMAC_1_reset),
    .io_macIO_dataIn(MYMAC_1_io_macIO_dataIn),
    .io_macIO_accIn(MYMAC_1_io_macIO_accIn),
    .io_macIO_switchw(MYMAC_1_io_macIO_switchw),
    .io_macIO_weightIn(MYMAC_1_io_macIO_weightIn),
    .io_macIO_weightWe(MYMAC_1_io_macIO_weightWe),
    .io_macIO_weightTag(MYMAC_1_io_macIO_weightTag),
    .io_macIO_outDelay(MYMAC_1_io_macIO_outDelay),
    .io_macIO_dataDelay(MYMAC_1_io_macIO_dataDelay),
    .io_macIO_switchDelay(MYMAC_1_io_macIO_switchDelay),
    .io_macIO_weightDelay(MYMAC_1_io_macIO_weightDelay),
    .io_macIO_weightWeDelay(MYMAC_1_io_macIO_weightWeDelay),
    .io_macIO_weightTagDelay(MYMAC_1_io_macIO_weightTagDelay)
  );
  MYMAC MYMAC_2 ( // @[MACArray.scala 22:15]
    .clock(MYMAC_2_clock),
    .reset(MYMAC_2_reset),
    .io_macIO_dataIn(MYMAC_2_io_macIO_dataIn),
    .io_macIO_accIn(MYMAC_2_io_macIO_accIn),
    .io_macIO_switchw(MYMAC_2_io_macIO_switchw),
    .io_macIO_weightIn(MYMAC_2_io_macIO_weightIn),
    .io_macIO_weightWe(MYMAC_2_io_macIO_weightWe),
    .io_macIO_weightTag(MYMAC_2_io_macIO_weightTag),
    .io_macIO_outDelay(MYMAC_2_io_macIO_outDelay),
    .io_macIO_dataDelay(MYMAC_2_io_macIO_dataDelay),
    .io_macIO_switchDelay(MYMAC_2_io_macIO_switchDelay),
    .io_macIO_weightDelay(MYMAC_2_io_macIO_weightDelay),
    .io_macIO_weightWeDelay(MYMAC_2_io_macIO_weightWeDelay),
    .io_macIO_weightTagDelay(MYMAC_2_io_macIO_weightTagDelay)
  );
  MYMAC MYMAC_3 ( // @[MACArray.scala 22:15]
    .clock(MYMAC_3_clock),
    .reset(MYMAC_3_reset),
    .io_macIO_dataIn(MYMAC_3_io_macIO_dataIn),
    .io_macIO_accIn(MYMAC_3_io_macIO_accIn),
    .io_macIO_switchw(MYMAC_3_io_macIO_switchw),
    .io_macIO_weightIn(MYMAC_3_io_macIO_weightIn),
    .io_macIO_weightWe(MYMAC_3_io_macIO_weightWe),
    .io_macIO_weightTag(MYMAC_3_io_macIO_weightTag),
    .io_macIO_outDelay(MYMAC_3_io_macIO_outDelay),
    .io_macIO_dataDelay(MYMAC_3_io_macIO_dataDelay),
    .io_macIO_switchDelay(MYMAC_3_io_macIO_switchDelay),
    .io_macIO_weightDelay(MYMAC_3_io_macIO_weightDelay),
    .io_macIO_weightWeDelay(MYMAC_3_io_macIO_weightWeDelay),
    .io_macIO_weightTagDelay(MYMAC_3_io_macIO_weightTagDelay)
  );
  MYMAC MYMAC_4 ( // @[MACArray.scala 22:15]
    .clock(MYMAC_4_clock),
    .reset(MYMAC_4_reset),
    .io_macIO_dataIn(MYMAC_4_io_macIO_dataIn),
    .io_macIO_accIn(MYMAC_4_io_macIO_accIn),
    .io_macIO_switchw(MYMAC_4_io_macIO_switchw),
    .io_macIO_weightIn(MYMAC_4_io_macIO_weightIn),
    .io_macIO_weightWe(MYMAC_4_io_macIO_weightWe),
    .io_macIO_weightTag(MYMAC_4_io_macIO_weightTag),
    .io_macIO_outDelay(MYMAC_4_io_macIO_outDelay),
    .io_macIO_dataDelay(MYMAC_4_io_macIO_dataDelay),
    .io_macIO_switchDelay(MYMAC_4_io_macIO_switchDelay),
    .io_macIO_weightDelay(MYMAC_4_io_macIO_weightDelay),
    .io_macIO_weightWeDelay(MYMAC_4_io_macIO_weightWeDelay),
    .io_macIO_weightTagDelay(MYMAC_4_io_macIO_weightTagDelay)
  );
  MYMAC MYMAC_5 ( // @[MACArray.scala 22:15]
    .clock(MYMAC_5_clock),
    .reset(MYMAC_5_reset),
    .io_macIO_dataIn(MYMAC_5_io_macIO_dataIn),
    .io_macIO_accIn(MYMAC_5_io_macIO_accIn),
    .io_macIO_switchw(MYMAC_5_io_macIO_switchw),
    .io_macIO_weightIn(MYMAC_5_io_macIO_weightIn),
    .io_macIO_weightWe(MYMAC_5_io_macIO_weightWe),
    .io_macIO_weightTag(MYMAC_5_io_macIO_weightTag),
    .io_macIO_outDelay(MYMAC_5_io_macIO_outDelay),
    .io_macIO_dataDelay(MYMAC_5_io_macIO_dataDelay),
    .io_macIO_switchDelay(MYMAC_5_io_macIO_switchDelay),
    .io_macIO_weightDelay(MYMAC_5_io_macIO_weightDelay),
    .io_macIO_weightWeDelay(MYMAC_5_io_macIO_weightWeDelay),
    .io_macIO_weightTagDelay(MYMAC_5_io_macIO_weightTagDelay)
  );
  MYMAC MYMAC_6 ( // @[MACArray.scala 22:15]
    .clock(MYMAC_6_clock),
    .reset(MYMAC_6_reset),
    .io_macIO_dataIn(MYMAC_6_io_macIO_dataIn),
    .io_macIO_accIn(MYMAC_6_io_macIO_accIn),
    .io_macIO_switchw(MYMAC_6_io_macIO_switchw),
    .io_macIO_weightIn(MYMAC_6_io_macIO_weightIn),
    .io_macIO_weightWe(MYMAC_6_io_macIO_weightWe),
    .io_macIO_weightTag(MYMAC_6_io_macIO_weightTag),
    .io_macIO_outDelay(MYMAC_6_io_macIO_outDelay),
    .io_macIO_dataDelay(MYMAC_6_io_macIO_dataDelay),
    .io_macIO_switchDelay(MYMAC_6_io_macIO_switchDelay),
    .io_macIO_weightDelay(MYMAC_6_io_macIO_weightDelay),
    .io_macIO_weightWeDelay(MYMAC_6_io_macIO_weightWeDelay),
    .io_macIO_weightTagDelay(MYMAC_6_io_macIO_weightTagDelay)
  );
  MYMAC MYMAC_7 ( // @[MACArray.scala 22:15]
    .clock(MYMAC_7_clock),
    .reset(MYMAC_7_reset),
    .io_macIO_dataIn(MYMAC_7_io_macIO_dataIn),
    .io_macIO_accIn(MYMAC_7_io_macIO_accIn),
    .io_macIO_switchw(MYMAC_7_io_macIO_switchw),
    .io_macIO_weightIn(MYMAC_7_io_macIO_weightIn),
    .io_macIO_weightWe(MYMAC_7_io_macIO_weightWe),
    .io_macIO_weightTag(MYMAC_7_io_macIO_weightTag),
    .io_macIO_outDelay(MYMAC_7_io_macIO_outDelay),
    .io_macIO_dataDelay(MYMAC_7_io_macIO_dataDelay),
    .io_macIO_switchDelay(MYMAC_7_io_macIO_switchDelay),
    .io_macIO_weightDelay(MYMAC_7_io_macIO_weightDelay),
    .io_macIO_weightWeDelay(MYMAC_7_io_macIO_weightWeDelay),
    .io_macIO_weightTagDelay(MYMAC_7_io_macIO_weightTagDelay)
  );
  MYMAC MYMAC_8 ( // @[MACArray.scala 22:15]
    .clock(MYMAC_8_clock),
    .reset(MYMAC_8_reset),
    .io_macIO_dataIn(MYMAC_8_io_macIO_dataIn),
    .io_macIO_accIn(MYMAC_8_io_macIO_accIn),
    .io_macIO_switchw(MYMAC_8_io_macIO_switchw),
    .io_macIO_weightIn(MYMAC_8_io_macIO_weightIn),
    .io_macIO_weightWe(MYMAC_8_io_macIO_weightWe),
    .io_macIO_weightTag(MYMAC_8_io_macIO_weightTag),
    .io_macIO_outDelay(MYMAC_8_io_macIO_outDelay),
    .io_macIO_dataDelay(MYMAC_8_io_macIO_dataDelay),
    .io_macIO_switchDelay(MYMAC_8_io_macIO_switchDelay),
    .io_macIO_weightDelay(MYMAC_8_io_macIO_weightDelay),
    .io_macIO_weightWeDelay(MYMAC_8_io_macIO_weightWeDelay),
    .io_macIO_weightTagDelay(MYMAC_8_io_macIO_weightTagDelay)
  );
  assign io_dataOut_0 = MYMAC_6_io_macIO_outDelay; // @[MACArray.scala 76:23]
  assign io_dataOut_1 = MYMAC_7_io_macIO_outDelay; // @[MACArray.scala 76:23]
  assign io_dataOut_2 = MYMAC_8_io_macIO_outDelay; // @[MACArray.scala 76:23]
  assign MYMAC_clock = clock;
  assign MYMAC_reset = reset;
  assign MYMAC_io_macIO_dataIn = io_dataIn_0; // @[MACArray.scala 81:44]
  assign MYMAC_io_macIO_accIn = 32'sh0; // @[MACArray.scala 103:32]
  assign MYMAC_io_macIO_switchw = io_switchw_0; // @[MACArray.scala 82:45]
  assign MYMAC_io_macIO_weightIn = currentWeight[7:0]; // @[MACArray.scala 106:54]
  assign MYMAC_io_macIO_weightWe = programming; // @[MACArray.scala 25:25 45:22]
  assign MYMAC_io_macIO_weightTag = {{6'd0}, progstep}; // @[MACArray.scala 107:36]
  assign MYMAC_1_clock = clock;
  assign MYMAC_1_reset = reset;
  assign MYMAC_1_io_macIO_dataIn = MYMAC_io_macIO_dataDelay; // @[MACArray.scala 69:52]
  assign MYMAC_1_io_macIO_accIn = 32'sh0; // @[MACArray.scala 103:32]
  assign MYMAC_1_io_macIO_switchw = MYMAC_io_macIO_switchDelay; // @[MACArray.scala 70:53]
  assign MYMAC_1_io_macIO_weightIn = currentWeight[15:8]; // @[MACArray.scala 106:54]
  assign MYMAC_1_io_macIO_weightWe = programming; // @[MACArray.scala 25:25 45:22]
  assign MYMAC_1_io_macIO_weightTag = {{6'd0}, progstep}; // @[MACArray.scala 107:36]
  assign MYMAC_2_clock = clock;
  assign MYMAC_2_reset = reset;
  assign MYMAC_2_io_macIO_dataIn = MYMAC_1_io_macIO_dataDelay; // @[MACArray.scala 69:52]
  assign MYMAC_2_io_macIO_accIn = 32'sh0; // @[MACArray.scala 103:32]
  assign MYMAC_2_io_macIO_switchw = MYMAC_1_io_macIO_switchDelay; // @[MACArray.scala 70:53]
  assign MYMAC_2_io_macIO_weightIn = currentWeight[23:16]; // @[MACArray.scala 106:54]
  assign MYMAC_2_io_macIO_weightWe = programming; // @[MACArray.scala 25:25 45:22]
  assign MYMAC_2_io_macIO_weightTag = {{6'd0}, progstep}; // @[MACArray.scala 107:36]
  assign MYMAC_3_clock = clock;
  assign MYMAC_3_reset = reset;
  assign MYMAC_3_io_macIO_dataIn = io_dataIn_1; // @[MACArray.scala 81:44]
  assign MYMAC_3_io_macIO_accIn = MYMAC_io_macIO_outDelay; // @[MACArray.scala 61:53]
  assign MYMAC_3_io_macIO_switchw = io_switchw_1; // @[MACArray.scala 82:45]
  assign MYMAC_3_io_macIO_weightIn = MYMAC_io_macIO_weightDelay; // @[MACArray.scala 59:56]
  assign MYMAC_3_io_macIO_weightWe = MYMAC_io_macIO_weightWeDelay; // @[MACArray.scala 60:56]
  assign MYMAC_3_io_macIO_weightTag = MYMAC_io_macIO_weightTagDelay; // @[MACArray.scala 62:57]
  assign MYMAC_4_clock = clock;
  assign MYMAC_4_reset = reset;
  assign MYMAC_4_io_macIO_dataIn = MYMAC_3_io_macIO_dataDelay; // @[MACArray.scala 69:52]
  assign MYMAC_4_io_macIO_accIn = MYMAC_1_io_macIO_outDelay; // @[MACArray.scala 61:53]
  assign MYMAC_4_io_macIO_switchw = MYMAC_3_io_macIO_switchDelay; // @[MACArray.scala 70:53]
  assign MYMAC_4_io_macIO_weightIn = MYMAC_1_io_macIO_weightDelay; // @[MACArray.scala 59:56]
  assign MYMAC_4_io_macIO_weightWe = MYMAC_1_io_macIO_weightWeDelay; // @[MACArray.scala 60:56]
  assign MYMAC_4_io_macIO_weightTag = MYMAC_1_io_macIO_weightTagDelay; // @[MACArray.scala 62:57]
  assign MYMAC_5_clock = clock;
  assign MYMAC_5_reset = reset;
  assign MYMAC_5_io_macIO_dataIn = MYMAC_4_io_macIO_dataDelay; // @[MACArray.scala 69:52]
  assign MYMAC_5_io_macIO_accIn = MYMAC_2_io_macIO_outDelay; // @[MACArray.scala 61:53]
  assign MYMAC_5_io_macIO_switchw = MYMAC_4_io_macIO_switchDelay; // @[MACArray.scala 70:53]
  assign MYMAC_5_io_macIO_weightIn = MYMAC_2_io_macIO_weightDelay; // @[MACArray.scala 59:56]
  assign MYMAC_5_io_macIO_weightWe = MYMAC_2_io_macIO_weightWeDelay; // @[MACArray.scala 60:56]
  assign MYMAC_5_io_macIO_weightTag = MYMAC_2_io_macIO_weightTagDelay; // @[MACArray.scala 62:57]
  assign MYMAC_6_clock = clock;
  assign MYMAC_6_reset = reset;
  assign MYMAC_6_io_macIO_dataIn = io_dataIn_2; // @[MACArray.scala 81:44]
  assign MYMAC_6_io_macIO_accIn = MYMAC_3_io_macIO_outDelay; // @[MACArray.scala 61:53]
  assign MYMAC_6_io_macIO_switchw = io_switchw_2; // @[MACArray.scala 82:45]
  assign MYMAC_6_io_macIO_weightIn = MYMAC_3_io_macIO_weightDelay; // @[MACArray.scala 59:56]
  assign MYMAC_6_io_macIO_weightWe = MYMAC_3_io_macIO_weightWeDelay; // @[MACArray.scala 60:56]
  assign MYMAC_6_io_macIO_weightTag = MYMAC_3_io_macIO_weightTagDelay; // @[MACArray.scala 62:57]
  assign MYMAC_7_clock = clock;
  assign MYMAC_7_reset = reset;
  assign MYMAC_7_io_macIO_dataIn = MYMAC_6_io_macIO_dataDelay; // @[MACArray.scala 69:52]
  assign MYMAC_7_io_macIO_accIn = MYMAC_4_io_macIO_outDelay; // @[MACArray.scala 61:53]
  assign MYMAC_7_io_macIO_switchw = MYMAC_6_io_macIO_switchDelay; // @[MACArray.scala 70:53]
  assign MYMAC_7_io_macIO_weightIn = MYMAC_4_io_macIO_weightDelay; // @[MACArray.scala 59:56]
  assign MYMAC_7_io_macIO_weightWe = MYMAC_4_io_macIO_weightWeDelay; // @[MACArray.scala 60:56]
  assign MYMAC_7_io_macIO_weightTag = MYMAC_4_io_macIO_weightTagDelay; // @[MACArray.scala 62:57]
  assign MYMAC_8_clock = clock;
  assign MYMAC_8_reset = reset;
  assign MYMAC_8_io_macIO_dataIn = MYMAC_7_io_macIO_dataDelay; // @[MACArray.scala 69:52]
  assign MYMAC_8_io_macIO_accIn = MYMAC_5_io_macIO_outDelay; // @[MACArray.scala 61:53]
  assign MYMAC_8_io_macIO_switchw = MYMAC_7_io_macIO_switchDelay; // @[MACArray.scala 70:53]
  assign MYMAC_8_io_macIO_weightIn = MYMAC_5_io_macIO_weightDelay; // @[MACArray.scala 59:56]
  assign MYMAC_8_io_macIO_weightWe = MYMAC_5_io_macIO_weightWeDelay; // @[MACArray.scala 60:56]
  assign MYMAC_8_io_macIO_weightTag = MYMAC_5_io_macIO_weightTagDelay; // @[MACArray.scala 62:57]
  always @(posedge clock) begin
    if (reset) begin // @[MACArray.scala 26:30]
      programming <= 1'h0; // @[MACArray.scala 26:30]
    end else begin
      programming <= _GEN_1;
    end
    if (reset) begin // @[MACArray.scala 27:27]
      progstep <= 2'h0; // @[MACArray.scala 27:27]
    end else if (programming) begin // @[MACArray.scala 37:33]
      progstep <= _progstep_T_1; // @[MACArray.scala 38:18]
    end else begin
      progstep <= 2'h0; // @[MACArray.scala 40:18]
    end
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  programming = _RAND_0[0:0];
  _RAND_1 = {1{`RANDOM}};
  progstep = _RAND_1[1:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule
module MYAccumulator(
  input         clock,
  input         reset,
  input  [7:0]  io_accumIn_waddr,
  input         io_accumIn_wen,
  input         io_accumIn_wclear,
  input         io_accumIn_lastvec,
  input  [7:0]  io_raddr,
  input  [31:0] io_dataIn,
  output [7:0]  io_accumOut_waddr,
  output        io_accumOut_wen,
  output        io_accumOut_wclear,
  output        io_accumOut_lastvec,
  output [31:0] io_dataOut
);
`ifdef RANDOMIZE_MEM_INIT
  reg [31:0] _RAND_0;
`endif // RANDOMIZE_MEM_INIT
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_1;
  reg [31:0] _RAND_2;
  reg [31:0] _RAND_3;
  reg [31:0] _RAND_4;
  reg [31:0] _RAND_5;
  reg [31:0] _RAND_6;
  reg [31:0] _RAND_7;
  reg [31:0] _RAND_8;
`endif // RANDOMIZE_REG_INIT
  reg [31:0] mem [0:255]; // @[Accumulator.scala 27:30]
  wire  mem_MPORT_1_en; // @[Accumulator.scala 27:30]
  wire [7:0] mem_MPORT_1_addr; // @[Accumulator.scala 27:30]
  wire [31:0] mem_MPORT_1_data; // @[Accumulator.scala 27:30]
  wire  mem_io_dataOut_MPORT_en; // @[Accumulator.scala 27:30]
  wire [7:0] mem_io_dataOut_MPORT_addr; // @[Accumulator.scala 27:30]
  wire [31:0] mem_io_dataOut_MPORT_data; // @[Accumulator.scala 27:30]
  wire [31:0] mem_MPORT_data; // @[Accumulator.scala 27:30]
  wire [7:0] mem_MPORT_addr; // @[Accumulator.scala 27:30]
  wire  mem_MPORT_mask; // @[Accumulator.scala 27:30]
  wire  mem_MPORT_en; // @[Accumulator.scala 27:30]
  wire [31:0] mem_MPORT_2_data; // @[Accumulator.scala 27:30]
  wire [7:0] mem_MPORT_2_addr; // @[Accumulator.scala 27:30]
  wire  mem_MPORT_2_mask; // @[Accumulator.scala 27:30]
  wire  mem_MPORT_2_en; // @[Accumulator.scala 27:30]
  reg  mem_MPORT_1_en_pipe_0;
  reg [7:0] mem_MPORT_1_addr_pipe_0;
  reg  mem_io_dataOut_MPORT_en_pipe_0;
  reg [7:0] mem_io_dataOut_MPORT_addr_pipe_0;
  wire  _GEN_9 = io_accumIn_wclear ? 1'h0 : 1'h1; // @[Accumulator.scala 27:30 30:40]
  reg [7:0] io_accumOut_waddr_REG; // @[Accumulator.scala 39:37]
  reg  io_accumOut_wen_REG; // @[Accumulator.scala 40:37]
  reg  io_accumOut_wclear_REG; // @[Accumulator.scala 41:37]
  reg  io_accumOut_lastvec_REG; // @[Accumulator.scala 42:38]
  assign mem_MPORT_1_en = mem_MPORT_1_en_pipe_0;
  assign mem_MPORT_1_addr = mem_MPORT_1_addr_pipe_0;
  assign mem_MPORT_1_data = mem[mem_MPORT_1_addr]; // @[Accumulator.scala 27:30]
  assign mem_io_dataOut_MPORT_en = mem_io_dataOut_MPORT_en_pipe_0;
  assign mem_io_dataOut_MPORT_addr = mem_io_dataOut_MPORT_addr_pipe_0;
  assign mem_io_dataOut_MPORT_data = mem[mem_io_dataOut_MPORT_addr]; // @[Accumulator.scala 27:30]
  assign mem_MPORT_data = io_dataIn;
  assign mem_MPORT_addr = io_accumIn_waddr;
  assign mem_MPORT_mask = 1'h1;
  assign mem_MPORT_en = io_accumIn_wen & io_accumIn_wclear;
  assign mem_MPORT_2_data = $signed(io_dataIn) + $signed(mem_MPORT_1_data);
  assign mem_MPORT_2_addr = io_accumIn_waddr;
  assign mem_MPORT_2_mask = 1'h1;
  assign mem_MPORT_2_en = io_accumIn_wen & _GEN_9;
  assign io_accumOut_waddr = io_accumOut_waddr_REG; // @[Accumulator.scala 39:27]
  assign io_accumOut_wen = io_accumOut_wen_REG; // @[Accumulator.scala 40:27]
  assign io_accumOut_wclear = io_accumOut_wclear_REG; // @[Accumulator.scala 41:27]
  assign io_accumOut_lastvec = io_accumOut_lastvec_REG; // @[Accumulator.scala 42:28]
  assign io_dataOut = mem_io_dataOut_MPORT_data; // @[Accumulator.scala 37:20]
  always @(posedge clock) begin
    if (mem_MPORT_en & mem_MPORT_mask) begin
      mem[mem_MPORT_addr] <= mem_MPORT_data; // @[Accumulator.scala 27:30]
    end
    if (mem_MPORT_2_en & mem_MPORT_2_mask) begin
      mem[mem_MPORT_2_addr] <= mem_MPORT_2_data; // @[Accumulator.scala 27:30]
    end
    mem_MPORT_1_en_pipe_0 <= io_accumIn_wen & _GEN_9;
    if (io_accumIn_wen & _GEN_9) begin
      mem_MPORT_1_addr_pipe_0 <= io_accumIn_waddr;
    end
    mem_io_dataOut_MPORT_en_pipe_0 <= 1'h1;
    if (1'h1) begin
      mem_io_dataOut_MPORT_addr_pipe_0 <= io_raddr;
    end
    if (reset) begin // @[Accumulator.scala 39:37]
      io_accumOut_waddr_REG <= 8'h0; // @[Accumulator.scala 39:37]
    end else begin
      io_accumOut_waddr_REG <= io_accumIn_waddr; // @[Accumulator.scala 39:37]
    end
    if (reset) begin // @[Accumulator.scala 40:37]
      io_accumOut_wen_REG <= 1'h0; // @[Accumulator.scala 40:37]
    end else begin
      io_accumOut_wen_REG <= io_accumIn_wen; // @[Accumulator.scala 40:37]
    end
    if (reset) begin // @[Accumulator.scala 41:37]
      io_accumOut_wclear_REG <= 1'h0; // @[Accumulator.scala 41:37]
    end else begin
      io_accumOut_wclear_REG <= io_accumIn_wclear; // @[Accumulator.scala 41:37]
    end
    if (reset) begin // @[Accumulator.scala 42:38]
      io_accumOut_lastvec_REG <= 1'h0; // @[Accumulator.scala 42:38]
    end else begin
      io_accumOut_lastvec_REG <= io_accumIn_lastvec; // @[Accumulator.scala 42:38]
    end
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_MEM_INIT
  _RAND_0 = {1{`RANDOM}};
  for (initvar = 0; initvar < 256; initvar = initvar+1)
    mem[initvar] = _RAND_0[31:0];
`endif // RANDOMIZE_MEM_INIT
`ifdef RANDOMIZE_REG_INIT
  _RAND_1 = {1{`RANDOM}};
  mem_MPORT_1_en_pipe_0 = _RAND_1[0:0];
  _RAND_2 = {1{`RANDOM}};
  mem_MPORT_1_addr_pipe_0 = _RAND_2[7:0];
  _RAND_3 = {1{`RANDOM}};
  mem_io_dataOut_MPORT_en_pipe_0 = _RAND_3[0:0];
  _RAND_4 = {1{`RANDOM}};
  mem_io_dataOut_MPORT_addr_pipe_0 = _RAND_4[7:0];
  _RAND_5 = {1{`RANDOM}};
  io_accumOut_waddr_REG = _RAND_5[7:0];
  _RAND_6 = {1{`RANDOM}};
  io_accumOut_wen_REG = _RAND_6[0:0];
  _RAND_7 = {1{`RANDOM}};
  io_accumOut_wclear_REG = _RAND_7[0:0];
  _RAND_8 = {1{`RANDOM}};
  io_accumOut_lastvec_REG = _RAND_8[0:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule
module MYAccumulators(
  input         clock,
  input         reset,
  input  [7:0]  io_accumsIn_waddr,
  input         io_accumsIn_wen,
  input         io_accumsIn_wclear,
  input         io_accumsIn_lastvec,
  input  [31:0] io_datasIn_0,
  input  [31:0] io_datasIn_1,
  input  [31:0] io_datasIn_2,
  input  [7:0]  io_raddr,
  output [31:0] io_datasOut_0,
  output [31:0] io_datasOut_1,
  output [31:0] io_datasOut_2,
  output        io_done
);
  wire  MYAccumulator_clock; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_reset; // @[Accumulator.scala 58:23]
  wire [7:0] MYAccumulator_io_accumIn_waddr; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_io_accumIn_wen; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_io_accumIn_wclear; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_io_accumIn_lastvec; // @[Accumulator.scala 58:23]
  wire [7:0] MYAccumulator_io_raddr; // @[Accumulator.scala 58:23]
  wire [31:0] MYAccumulator_io_dataIn; // @[Accumulator.scala 58:23]
  wire [7:0] MYAccumulator_io_accumOut_waddr; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_io_accumOut_wen; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_io_accumOut_wclear; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_io_accumOut_lastvec; // @[Accumulator.scala 58:23]
  wire [31:0] MYAccumulator_io_dataOut; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_1_clock; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_1_reset; // @[Accumulator.scala 58:23]
  wire [7:0] MYAccumulator_1_io_accumIn_waddr; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_1_io_accumIn_wen; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_1_io_accumIn_wclear; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_1_io_accumIn_lastvec; // @[Accumulator.scala 58:23]
  wire [7:0] MYAccumulator_1_io_raddr; // @[Accumulator.scala 58:23]
  wire [31:0] MYAccumulator_1_io_dataIn; // @[Accumulator.scala 58:23]
  wire [7:0] MYAccumulator_1_io_accumOut_waddr; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_1_io_accumOut_wen; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_1_io_accumOut_wclear; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_1_io_accumOut_lastvec; // @[Accumulator.scala 58:23]
  wire [31:0] MYAccumulator_1_io_dataOut; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_2_clock; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_2_reset; // @[Accumulator.scala 58:23]
  wire [7:0] MYAccumulator_2_io_accumIn_waddr; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_2_io_accumIn_wen; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_2_io_accumIn_wclear; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_2_io_accumIn_lastvec; // @[Accumulator.scala 58:23]
  wire [7:0] MYAccumulator_2_io_raddr; // @[Accumulator.scala 58:23]
  wire [31:0] MYAccumulator_2_io_dataIn; // @[Accumulator.scala 58:23]
  wire [7:0] MYAccumulator_2_io_accumOut_waddr; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_2_io_accumOut_wen; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_2_io_accumOut_wclear; // @[Accumulator.scala 58:23]
  wire  MYAccumulator_2_io_accumOut_lastvec; // @[Accumulator.scala 58:23]
  wire [31:0] MYAccumulator_2_io_dataOut; // @[Accumulator.scala 58:23]
  MYAccumulator MYAccumulator ( // @[Accumulator.scala 58:23]
    .clock(MYAccumulator_clock),
    .reset(MYAccumulator_reset),
    .io_accumIn_waddr(MYAccumulator_io_accumIn_waddr),
    .io_accumIn_wen(MYAccumulator_io_accumIn_wen),
    .io_accumIn_wclear(MYAccumulator_io_accumIn_wclear),
    .io_accumIn_lastvec(MYAccumulator_io_accumIn_lastvec),
    .io_raddr(MYAccumulator_io_raddr),
    .io_dataIn(MYAccumulator_io_dataIn),
    .io_accumOut_waddr(MYAccumulator_io_accumOut_waddr),
    .io_accumOut_wen(MYAccumulator_io_accumOut_wen),
    .io_accumOut_wclear(MYAccumulator_io_accumOut_wclear),
    .io_accumOut_lastvec(MYAccumulator_io_accumOut_lastvec),
    .io_dataOut(MYAccumulator_io_dataOut)
  );
  MYAccumulator MYAccumulator_1 ( // @[Accumulator.scala 58:23]
    .clock(MYAccumulator_1_clock),
    .reset(MYAccumulator_1_reset),
    .io_accumIn_waddr(MYAccumulator_1_io_accumIn_waddr),
    .io_accumIn_wen(MYAccumulator_1_io_accumIn_wen),
    .io_accumIn_wclear(MYAccumulator_1_io_accumIn_wclear),
    .io_accumIn_lastvec(MYAccumulator_1_io_accumIn_lastvec),
    .io_raddr(MYAccumulator_1_io_raddr),
    .io_dataIn(MYAccumulator_1_io_dataIn),
    .io_accumOut_waddr(MYAccumulator_1_io_accumOut_waddr),
    .io_accumOut_wen(MYAccumulator_1_io_accumOut_wen),
    .io_accumOut_wclear(MYAccumulator_1_io_accumOut_wclear),
    .io_accumOut_lastvec(MYAccumulator_1_io_accumOut_lastvec),
    .io_dataOut(MYAccumulator_1_io_dataOut)
  );
  MYAccumulator MYAccumulator_2 ( // @[Accumulator.scala 58:23]
    .clock(MYAccumulator_2_clock),
    .reset(MYAccumulator_2_reset),
    .io_accumIn_waddr(MYAccumulator_2_io_accumIn_waddr),
    .io_accumIn_wen(MYAccumulator_2_io_accumIn_wen),
    .io_accumIn_wclear(MYAccumulator_2_io_accumIn_wclear),
    .io_accumIn_lastvec(MYAccumulator_2_io_accumIn_lastvec),
    .io_raddr(MYAccumulator_2_io_raddr),
    .io_dataIn(MYAccumulator_2_io_dataIn),
    .io_accumOut_waddr(MYAccumulator_2_io_accumOut_waddr),
    .io_accumOut_wen(MYAccumulator_2_io_accumOut_wen),
    .io_accumOut_wclear(MYAccumulator_2_io_accumOut_wclear),
    .io_accumOut_lastvec(MYAccumulator_2_io_accumOut_lastvec),
    .io_dataOut(MYAccumulator_2_io_dataOut)
  );
  assign io_datasOut_0 = MYAccumulator_io_dataOut; // @[Accumulator.scala 76:32]
  assign io_datasOut_1 = MYAccumulator_1_io_dataOut; // @[Accumulator.scala 76:32]
  assign io_datasOut_2 = MYAccumulator_2_io_dataOut; // @[Accumulator.scala 76:32]
  assign io_done = MYAccumulator_2_io_accumOut_lastvec; // @[Accumulator.scala 79:17]
  assign MYAccumulator_clock = clock;
  assign MYAccumulator_reset = reset;
  assign MYAccumulator_io_accumIn_waddr = io_accumsIn_waddr; // @[Accumulator.scala 65:46]
  assign MYAccumulator_io_accumIn_wen = io_accumsIn_wen; // @[Accumulator.scala 65:46]
  assign MYAccumulator_io_accumIn_wclear = io_accumsIn_wclear; // @[Accumulator.scala 65:46]
  assign MYAccumulator_io_accumIn_lastvec = io_accumsIn_lastvec; // @[Accumulator.scala 65:46]
  assign MYAccumulator_io_raddr = io_raddr; // @[Accumulator.scala 66:46]
  assign MYAccumulator_io_dataIn = io_datasIn_0; // @[Accumulator.scala 67:46]
  assign MYAccumulator_1_clock = clock;
  assign MYAccumulator_1_reset = reset;
  assign MYAccumulator_1_io_accumIn_waddr = MYAccumulator_io_accumOut_waddr; // @[Accumulator.scala 69:46]
  assign MYAccumulator_1_io_accumIn_wen = MYAccumulator_io_accumOut_wen; // @[Accumulator.scala 69:46]
  assign MYAccumulator_1_io_accumIn_wclear = MYAccumulator_io_accumOut_wclear; // @[Accumulator.scala 69:46]
  assign MYAccumulator_1_io_accumIn_lastvec = MYAccumulator_io_accumOut_lastvec; // @[Accumulator.scala 69:46]
  assign MYAccumulator_1_io_raddr = io_raddr; // @[Accumulator.scala 70:44]
  assign MYAccumulator_1_io_dataIn = io_datasIn_1; // @[Accumulator.scala 71:47]
  assign MYAccumulator_2_clock = clock;
  assign MYAccumulator_2_reset = reset;
  assign MYAccumulator_2_io_accumIn_waddr = MYAccumulator_1_io_accumOut_waddr; // @[Accumulator.scala 69:46]
  assign MYAccumulator_2_io_accumIn_wen = MYAccumulator_1_io_accumOut_wen; // @[Accumulator.scala 69:46]
  assign MYAccumulator_2_io_accumIn_wclear = MYAccumulator_1_io_accumOut_wclear; // @[Accumulator.scala 69:46]
  assign MYAccumulator_2_io_accumIn_lastvec = MYAccumulator_1_io_accumOut_lastvec; // @[Accumulator.scala 69:46]
  assign MYAccumulator_2_io_raddr = io_raddr; // @[Accumulator.scala 70:44]
  assign MYAccumulator_2_io_dataIn = io_datasIn_2; // @[Accumulator.scala 71:47]
endmodule
module MyMMU(
  input          clock,
  input          reset,
  input  [71:0]  io_vectorIn,
  input  [7:0]   io_accumRaddr,
  input  [7:0]   io_mmu2setup_waddr,
  input          io_mmu2setup_wen,
  input          io_mmu2setup_wclear,
  input          io_mmu2setup_lastvec,
  input          io_switchW,
  input  [511:0] io_ddrData,
  input          io_ddrValid,
  output         io_done,
  output [31:0]  io_accOut_0,
  output [31:0]  io_accOut_1,
  output [31:0]  io_accOut_2
);
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_0;
  reg [31:0] _RAND_1;
  reg [31:0] _RAND_2;
  reg [31:0] _RAND_3;
  reg [31:0] _RAND_4;
`endif // RANDOMIZE_REG_INIT
  wire  myFifo_clock; // @[MyMMU.scala 57:28]
  wire  myFifo_reset; // @[MyMMU.scala 57:28]
  wire [511:0] myFifo_io_memData; // @[MyMMU.scala 57:28]
  wire  myFifo_io_memValid; // @[MyMMU.scala 57:28]
  wire  myFifo_io_advance_fifo; // @[MyMMU.scala 57:28]
  wire [23:0] myFifo_io_tile_0; // @[MyMMU.scala 57:28]
  wire [23:0] myFifo_io_tile_1; // @[MyMMU.scala 57:28]
  wire [23:0] myFifo_io_tile_2; // @[MyMMU.scala 57:28]
  wire  myFifo_io_ready; // @[MyMMU.scala 57:28]
  wire  macArraySetup_clock; // @[MyMMU.scala 77:35]
  wire  macArraySetup_reset; // @[MyMMU.scala 77:35]
  wire [71:0] macArraySetup_io_dataIn; // @[MyMMU.scala 77:35]
  wire [7:0] macArraySetup_io_mmu2setup_waddr; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_mmu2setup_wen; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_mmu2setup_wclear; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_mmu2setup_lastvec; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_switch; // @[MyMMU.scala 77:35]
  wire [7:0] macArraySetup_io_nextRow_0; // @[MyMMU.scala 77:35]
  wire [7:0] macArraySetup_io_nextRow_1; // @[MyMMU.scala 77:35]
  wire [7:0] macArraySetup_io_nextRow_2; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_switchOut_0; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_switchOut_1; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_switchOut_2; // @[MyMMU.scala 77:35]
  wire [7:0] macArraySetup_io_setup2accu_waddr; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_setup2accu_wen; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_setup2accu_wclear; // @[MyMMU.scala 77:35]
  wire  macArraySetup_io_setup2accu_lastvec; // @[MyMMU.scala 77:35]
  wire  macArray_clock; // @[MyMMU.scala 97:30]
  wire  macArray_reset; // @[MyMMU.scala 97:30]
  wire [7:0] macArray_io_dataIn_0; // @[MyMMU.scala 97:30]
  wire [7:0] macArray_io_dataIn_1; // @[MyMMU.scala 97:30]
  wire [7:0] macArray_io_dataIn_2; // @[MyMMU.scala 97:30]
  wire  macArray_io_switchw_0; // @[MyMMU.scala 97:30]
  wire  macArray_io_switchw_1; // @[MyMMU.scala 97:30]
  wire  macArray_io_switchw_2; // @[MyMMU.scala 97:30]
  wire [23:0] macArray_io_weightIn_0; // @[MyMMU.scala 97:30]
  wire [23:0] macArray_io_weightIn_1; // @[MyMMU.scala 97:30]
  wire [23:0] macArray_io_weightIn_2; // @[MyMMU.scala 97:30]
  wire  macArray_io_weightWe; // @[MyMMU.scala 97:30]
  wire [31:0] macArray_io_dataOut_0; // @[MyMMU.scala 97:30]
  wire [31:0] macArray_io_dataOut_1; // @[MyMMU.scala 97:30]
  wire [31:0] macArray_io_dataOut_2; // @[MyMMU.scala 97:30]
  wire  accumulators_clock; // @[MyMMU.scala 115:34]
  wire  accumulators_reset; // @[MyMMU.scala 115:34]
  wire [7:0] accumulators_io_accumsIn_waddr; // @[MyMMU.scala 115:34]
  wire  accumulators_io_accumsIn_wen; // @[MyMMU.scala 115:34]
  wire  accumulators_io_accumsIn_wclear; // @[MyMMU.scala 115:34]
  wire  accumulators_io_accumsIn_lastvec; // @[MyMMU.scala 115:34]
  wire [31:0] accumulators_io_datasIn_0; // @[MyMMU.scala 115:34]
  wire [31:0] accumulators_io_datasIn_1; // @[MyMMU.scala 115:34]
  wire [31:0] accumulators_io_datasIn_2; // @[MyMMU.scala 115:34]
  wire [7:0] accumulators_io_raddr; // @[MyMMU.scala 115:34]
  wire [31:0] accumulators_io_datasOut_0; // @[MyMMU.scala 115:34]
  wire [31:0] accumulators_io_datasOut_1; // @[MyMMU.scala 115:34]
  wire [31:0] accumulators_io_datasOut_2; // @[MyMMU.scala 115:34]
  wire  accumulators_io_done; // @[MyMMU.scala 115:34]
  reg  programming; // @[MyMMU.scala 32:34]
  reg [2:0] weightsWait; // @[MyMMU.scala 35:34]
  reg [2:0] weightsCount; // @[MyMMU.scala 36:35]
  reg  startup; // @[MyMMU.scala 38:30]
  reg  firstTile; // @[MyMMU.scala 41:32]
  wire  waiting = weightsWait != 3'h4; // @[MyMMU.scala 125:32]
  wire [2:0] _weightsWait_T_1 = weightsWait + 3'h1; // @[MyMMU.scala 130:44]
  wire  _T_3 = weightsCount == 3'h2; // @[MyMMU.scala 141:34]
  wire [2:0] _weightsCount_T_1 = weightsCount + 3'h1; // @[MyMMU.scala 145:54]
  wire  _GEN_0 = weightsCount == 3'h2 ? 1'h0 : programming; // @[MyMMU.scala 141:54 142:37 32:34]
  wire [2:0] _GEN_2 = weightsCount == 3'h2 ? weightsCount : _weightsCount_T_1; // @[MyMMU.scala 141:54 36:35 145:38]
  wire  _GEN_3 = weightsCount == 3'h2 ? 1'h0 : 1'h1; // @[MyMMU.scala 141:54 146:35]
  wire  _GEN_4 = programming ? _GEN_0 : programming; // @[MyMMU.scala 140:32 32:34]
  wire  _GEN_5 = programming & _T_3; // @[MyMMU.scala 140:32]
  wire [2:0] _GEN_6 = programming ? _GEN_2 : weightsCount; // @[MyMMU.scala 140:32 36:35]
  wire  _GEN_7 = programming & _GEN_3; // @[MyMMU.scala 140:32]
  wire [2:0] _GEN_8 = macArraySetup_io_switchOut_0 ? 3'h0 : weightsWait; // @[MyMMU.scala 136:50 137:29 35:34]
  wire  _GEN_9 = macArraySetup_io_switchOut_0 | _GEN_4; // @[MyMMU.scala 136:50 138:29]
  wire [2:0] _GEN_10 = macArraySetup_io_switchOut_0 ? 3'h0 : _GEN_6; // @[MyMMU.scala 136:50 139:30]
  wire  _GEN_11 = macArraySetup_io_switchOut_0 ? 1'h0 : _GEN_5; // @[MyMMU.scala 136:50]
  wire  _GEN_12 = macArraySetup_io_switchOut_0 ? 1'h0 : _GEN_7; // @[MyMMU.scala 136:50]
  wire  _GEN_14 = ~firstTile & myFifo_io_ready | _GEN_9; // @[MyMMU.scala 131:50 133:29]
  wire  _GEN_16 = ~firstTile & myFifo_io_ready | firstTile; // @[MyMMU.scala 131:50 135:29 41:32]
  wire  _GEN_17 = ~firstTile & myFifo_io_ready ? 1'h0 : _GEN_11; // @[MyMMU.scala 131:50]
  wire  _GEN_18 = ~firstTile & myFifo_io_ready ? 1'h0 : _GEN_12; // @[MyMMU.scala 131:50]
  wire  _GEN_23 = waiting ? 1'h0 : _GEN_17; // @[MyMMU.scala 129:28]
  wire  _GEN_24 = waiting ? 1'h0 : _GEN_18; // @[MyMMU.scala 129:28]
  MYFIFO myFifo ( // @[MyMMU.scala 57:28]
    .clock(myFifo_clock),
    .reset(myFifo_reset),
    .io_memData(myFifo_io_memData),
    .io_memValid(myFifo_io_memValid),
    .io_advance_fifo(myFifo_io_advance_fifo),
    .io_tile_0(myFifo_io_tile_0),
    .io_tile_1(myFifo_io_tile_1),
    .io_tile_2(myFifo_io_tile_2),
    .io_ready(myFifo_io_ready)
  );
  MACArraySetUp macArraySetup ( // @[MyMMU.scala 77:35]
    .clock(macArraySetup_clock),
    .reset(macArraySetup_reset),
    .io_dataIn(macArraySetup_io_dataIn),
    .io_mmu2setup_waddr(macArraySetup_io_mmu2setup_waddr),
    .io_mmu2setup_wen(macArraySetup_io_mmu2setup_wen),
    .io_mmu2setup_wclear(macArraySetup_io_mmu2setup_wclear),
    .io_mmu2setup_lastvec(macArraySetup_io_mmu2setup_lastvec),
    .io_switch(macArraySetup_io_switch),
    .io_nextRow_0(macArraySetup_io_nextRow_0),
    .io_nextRow_1(macArraySetup_io_nextRow_1),
    .io_nextRow_2(macArraySetup_io_nextRow_2),
    .io_switchOut_0(macArraySetup_io_switchOut_0),
    .io_switchOut_1(macArraySetup_io_switchOut_1),
    .io_switchOut_2(macArraySetup_io_switchOut_2),
    .io_setup2accu_waddr(macArraySetup_io_setup2accu_waddr),
    .io_setup2accu_wen(macArraySetup_io_setup2accu_wen),
    .io_setup2accu_wclear(macArraySetup_io_setup2accu_wclear),
    .io_setup2accu_lastvec(macArraySetup_io_setup2accu_lastvec)
  );
  MACArray macArray ( // @[MyMMU.scala 97:30]
    .clock(macArray_clock),
    .reset(macArray_reset),
    .io_dataIn_0(macArray_io_dataIn_0),
    .io_dataIn_1(macArray_io_dataIn_1),
    .io_dataIn_2(macArray_io_dataIn_2),
    .io_switchw_0(macArray_io_switchw_0),
    .io_switchw_1(macArray_io_switchw_1),
    .io_switchw_2(macArray_io_switchw_2),
    .io_weightIn_0(macArray_io_weightIn_0),
    .io_weightIn_1(macArray_io_weightIn_1),
    .io_weightIn_2(macArray_io_weightIn_2),
    .io_weightWe(macArray_io_weightWe),
    .io_dataOut_0(macArray_io_dataOut_0),
    .io_dataOut_1(macArray_io_dataOut_1),
    .io_dataOut_2(macArray_io_dataOut_2)
  );
  MYAccumulators accumulators ( // @[MyMMU.scala 115:34]
    .clock(accumulators_clock),
    .reset(accumulators_reset),
    .io_accumsIn_waddr(accumulators_io_accumsIn_waddr),
    .io_accumsIn_wen(accumulators_io_accumsIn_wen),
    .io_accumsIn_wclear(accumulators_io_accumsIn_wclear),
    .io_accumsIn_lastvec(accumulators_io_accumsIn_lastvec),
    .io_datasIn_0(accumulators_io_datasIn_0),
    .io_datasIn_1(accumulators_io_datasIn_1),
    .io_datasIn_2(accumulators_io_datasIn_2),
    .io_raddr(accumulators_io_raddr),
    .io_datasOut_0(accumulators_io_datasOut_0),
    .io_datasOut_1(accumulators_io_datasOut_1),
    .io_datasOut_2(accumulators_io_datasOut_2),
    .io_done(accumulators_io_done)
  );
  assign io_done = accumulators_io_done; // @[MyMMU.scala 121:17]
  assign io_accOut_0 = accumulators_io_datasOut_0; // @[MyMMU.scala 122:19]
  assign io_accOut_1 = accumulators_io_datasOut_1; // @[MyMMU.scala 122:19]
  assign io_accOut_2 = accumulators_io_datasOut_2; // @[MyMMU.scala 122:19]
  assign myFifo_clock = clock;
  assign myFifo_reset = reset;
  assign myFifo_io_memData = io_ddrData; // @[MyMMU.scala 59:27]
  assign myFifo_io_memValid = io_ddrValid; // @[MyMMU.scala 60:28]
  assign myFifo_io_advance_fifo = ~startup ? 1'h0 : _GEN_23; // @[MyMMU.scala 127:23]
  assign macArraySetup_clock = clock;
  assign macArraySetup_reset = reset;
  assign macArraySetup_io_dataIn = io_vectorIn; // @[MyMMU.scala 79:33]
  assign macArraySetup_io_mmu2setup_waddr = io_mmu2setup_waddr; // @[MyMMU.scala 80:36]
  assign macArraySetup_io_mmu2setup_wen = io_mmu2setup_wen; // @[MyMMU.scala 80:36]
  assign macArraySetup_io_mmu2setup_wclear = io_mmu2setup_wclear; // @[MyMMU.scala 80:36]
  assign macArraySetup_io_mmu2setup_lastvec = io_mmu2setup_lastvec; // @[MyMMU.scala 80:36]
  assign macArraySetup_io_switch = io_switchW; // @[MyMMU.scala 81:33]
  assign macArray_clock = clock;
  assign macArray_reset = reset;
  assign macArray_io_dataIn_0 = macArraySetup_io_nextRow_0; // @[MyMMU.scala 98:28]
  assign macArray_io_dataIn_1 = macArraySetup_io_nextRow_1; // @[MyMMU.scala 98:28]
  assign macArray_io_dataIn_2 = macArraySetup_io_nextRow_2; // @[MyMMU.scala 98:28]
  assign macArray_io_switchw_0 = macArraySetup_io_switchOut_0; // @[MyMMU.scala 99:29]
  assign macArray_io_switchw_1 = macArraySetup_io_switchOut_1; // @[MyMMU.scala 99:29]
  assign macArray_io_switchw_2 = macArraySetup_io_switchOut_2; // @[MyMMU.scala 99:29]
  assign macArray_io_weightIn_0 = myFifo_io_tile_0; // @[MyMMU.scala 100:30]
  assign macArray_io_weightIn_1 = myFifo_io_tile_1; // @[MyMMU.scala 100:30]
  assign macArray_io_weightIn_2 = myFifo_io_tile_2; // @[MyMMU.scala 100:30]
  assign macArray_io_weightWe = ~startup ? 1'h0 : _GEN_24; // @[MyMMU.scala 127:23]
  assign accumulators_clock = clock;
  assign accumulators_reset = reset;
  assign accumulators_io_accumsIn_waddr = macArraySetup_io_setup2accu_waddr; // @[MyMMU.scala 117:34]
  assign accumulators_io_accumsIn_wen = macArraySetup_io_setup2accu_wen; // @[MyMMU.scala 117:34]
  assign accumulators_io_accumsIn_wclear = macArraySetup_io_setup2accu_wclear; // @[MyMMU.scala 117:34]
  assign accumulators_io_accumsIn_lastvec = macArraySetup_io_setup2accu_lastvec; // @[MyMMU.scala 117:34]
  assign accumulators_io_datasIn_0 = macArray_io_dataOut_0; // @[MyMMU.scala 118:33]
  assign accumulators_io_datasIn_1 = macArray_io_dataOut_1; // @[MyMMU.scala 118:33]
  assign accumulators_io_datasIn_2 = macArray_io_dataOut_2; // @[MyMMU.scala 118:33]
  assign accumulators_io_raddr = io_accumRaddr; // @[MyMMU.scala 119:31]
  always @(posedge clock) begin
    if (reset) begin // @[MyMMU.scala 32:34]
      programming <= 1'h0; // @[MyMMU.scala 32:34]
    end else if (!(~startup)) begin // @[MyMMU.scala 127:23]
      if (!(waiting)) begin // @[MyMMU.scala 129:28]
        programming <= _GEN_14;
      end
    end
    if (reset) begin // @[MyMMU.scala 35:34]
      weightsWait <= 3'h4; // @[MyMMU.scala 35:34]
    end else if (~startup) begin // @[MyMMU.scala 127:23]
      weightsWait <= 3'h4; // @[MyMMU.scala 128:29]
    end else if (waiting) begin // @[MyMMU.scala 129:28]
      weightsWait <= _weightsWait_T_1; // @[MyMMU.scala 130:29]
    end else if (~firstTile & myFifo_io_ready) begin // @[MyMMU.scala 131:50]
      weightsWait <= 3'h4; // @[MyMMU.scala 132:29]
    end else begin
      weightsWait <= _GEN_8;
    end
    if (reset) begin // @[MyMMU.scala 36:35]
      weightsCount <= 3'h0; // @[MyMMU.scala 36:35]
    end else if (!(~startup)) begin // @[MyMMU.scala 127:23]
      if (!(waiting)) begin // @[MyMMU.scala 129:28]
        if (~firstTile & myFifo_io_ready) begin // @[MyMMU.scala 131:50]
          weightsCount <= 3'h0; // @[MyMMU.scala 134:30]
        end else begin
          weightsCount <= _GEN_10;
        end
      end
    end
    if (reset) begin // @[MyMMU.scala 38:30]
      startup <= 1'h0; // @[MyMMU.scala 38:30]
    end else begin
      startup <= 1'h1; // @[MyMMU.scala 38:30]
    end
    if (reset) begin // @[MyMMU.scala 41:32]
      firstTile <= 1'h0; // @[MyMMU.scala 41:32]
    end else if (!(~startup)) begin // @[MyMMU.scala 127:23]
      if (!(waiting)) begin // @[MyMMU.scala 129:28]
        firstTile <= _GEN_16;
      end
    end
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  programming = _RAND_0[0:0];
  _RAND_1 = {1{`RANDOM}};
  weightsWait = _RAND_1[2:0];
  _RAND_2 = {1{`RANDOM}};
  weightsCount = _RAND_2[2:0];
  _RAND_3 = {1{`RANDOM}};
  startup = _RAND_3[0:0];
  _RAND_4 = {1{`RANDOM}};
  firstTile = _RAND_4[0:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule
